
//立即执行函数(异步,类似于setTimeout的时间设置为0)
setImmediate(() => {
  console.log(1);
})

//定义一个微任务(异步分为宏任务和微任务,这个queueMicrotask就是语义化的微任务)
queueMicrotask(() => {

})


//立即执行函数(属于微任务,一定要排在微任务队列的第一个)
process.nextTick(() => {

})


/* 
浏览器的事件轮询机制：
  /* 
  宏任务和微任务:
    - 异步代码有优先级关系,分为宏任务代码和微任务代码。微任务优先级高先执行，宏任务优先级低后执行。
    - 宏任务是宿主发起的：包括整体代码script，setTimeout，setInterval等等
    - 微任务是js自身发起的： Promise.then/catch/fanally，process.nextTick，queueMicrotask
    - 浏览器事件轮询执行过程:
      - 执行栈选择最先进入队列的宏任务（一般都是script），执行其同步代码直至结束
      - 在执行同步代码的过程中,如果遇到宏任务,则把宏任务交给浏览器对应的管理模块(DOM管理模块,ajax管理模块,定时器管理模块)进行管理,当宏任务的回调需要被执行的时候,会把回调函数放入回调队列(callBack queue)中等待执行
      - 如果遇到微任务,则直接把微任务的回调放入微任务队列中等待执行
      - 当同步代码执行完成,先清空微任务队列,然后去宏任务队列中执行宏任务,每执行完一个宏任务都会再去清空微任务队列

*/
/* 
  nodejs的事件轮询机制:
    - js是单线程的,我们想要做到非阻塞,那么当我们遇到异步代码的时候,会把异步代码交给libuv的线程池进行管理,主线程依然继续向下执行同步代码
    - libuv会开启多个线程去管理不同的异步代码,当异步代码需要被执行的时候,会把回调函数依次放入到libuv提供的对应的轮询队列中去,(因为node中异步种类繁多,libuv提供了多种回调队列)
    - 回调队列的顺序和种类
      1. timers阶段:
        处理定时器回调函数
      2. pending callbacks 
        这个阶段用来处理系统操作的回调函数
      3. idle prepare阶段
        此阶段是仅供nodejs内部操作调用
      4. poll阶段
        这个阶段主要用来处理如IO操作，网络请求等异步操作
        当进入poll阶段之后,如果poll阶段为空,则除非timers阶段和 check 阶段有回调等待,否则就会一直等到poll阶段有新的回调执行
      5. check阶段:
        这个阶段用来处理setImmediate的回调函数
      6. close callbacks阶段
        这个阶段用来处理close事件
*/